package medium;//给定两个整数 n 和 k，返回范围 [1, n] 中所有可能的 k 个数的组合。
//
// 你可以按 任何顺序 返回答案。
//
//
//
// 示例 1：
//
//
//输入：n = 4, k = 2
//输出：
//[
//  [2,4],
//  [3,4],
//  [2,3],
//  [1,2],
//  [1,3],
//  [1,4],
//]
//
// 示例 2：
//
//
//输入：n = 1, k = 1
//输出：[[1]]
//
//
//
// 提示：
//
//
// 1 <= n <= 20
// 1 <= k <= n
//
// Related Topics 数组 回溯
// 👍 671 👎 0


import java.util.ArrayList;
import java.util.List;

//leetcode submit region begin(Prohibit modification and deletion)
public class L77 {

    public static void main(String[] args) {
        System.out.println(combine(4, 2));
    }

    public static List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> res = new ArrayList<>();
        combine(n, k, 1, new ArrayList<>(), res);
        return res;
    }

    public static void combine(int n, int k, int l, List<Integer> row, List<List<Integer>> res) {
        if (k == 0) {
            res.add(row);
            return;
        }
        for (int i = l; i <= n; i++) {
            List<Integer> copy = new ArrayList<>(row);
            row.add(i);
            combine(n, k - 1, i + 1, row, res);
            row = copy;
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)
